package com.yan.qing.demo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;

/**
 * @description: 两任务组合
 * @author: lf
 * @create: 2021年12月16日 10:35:00
 */
@Service
public class BothTest {
    @Resource(name = "asyncExecutor")
    private ThreadPoolTaskExecutor service;
    public void both(){
        /**
         * 异步，两任务组合 ：两个任务都完成，第三个任务才开始执行
         */

        //定义两个任务
        //任务一
        CompletableFuture<Integer> task1 = CompletableFuture.supplyAsync(() -> {
            int i = 5;

            System.out.println("任务一开始执行" + i);
            System.out.println ("Thread.currentThread ().getName () = " + Thread.currentThread ().getName ());
            return i;
        }, service);

        //任务二
        CompletableFuture<Integer> task2 = CompletableFuture.supplyAsync(() -> {
            int i = 10;
            System.out.println("任务二开始执行" + i);
            return i;
        }, service);

        //要求：任务一、二都完成后才执行任务三
//      runAfterBothAsync：无传入值、无返回值
        task1.runAfterBothAsync(task2,()->{
            System.out.println("任务三开始执行-runAfterBothAsync：无传入值、无返回值  ");
        },service);

//      thenAcceptBothAsync：有传入值、无返回值
        task1.thenAcceptBothAsync(task2,(x,y)->{
            System.out.println("任务三开始执行-runAfterBothAsync：传入值、无返回值  task1的结果是x ,task2的结果是y"+x+"-----"+y);
        },service);


//      thenCombineAsync：有传入值、有返回值
        task1.thenCombineAsync(task2,(x,y)->{
            System.out.println ("Thread.currentThread ().getName () = " + Thread.currentThread ().getName ());
            System.out.println("任务三开始执行-runAfterBothAsync：无传入值、无返回值  task1的结果是x ,task2的结果是y,task3返回hello"+x+"-----"+y);
            return "hello";
        },service);



        /**
         * 异步，两任务组合 ：两个任务都完成其中一个完成，第三个任务才开始执行
         */

        /**
         * runAfterEither 无传入值、无返回值
         * acceptEither 有传入值、无返回值
         * applyToEither 有传入值、有返回值
         * 代码同上！
         */
    }
}